﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL.Entities;
using System.Data.SqlClient;
using System.Data;

namespace DAL
{
    public class CuponDAL : DBController
    {
        public CuponDAL()
        { }

        public List<CuponEntity> GetCuponesByIdCiudad(int idCiudad, string fechaActual)
        {
            List<CuponEntity> cupones = new List<CuponEntity>();

            using (SqlConnection conn = this.OpenConn())
            {

                SqlDataReader dr;

                SqlCommand dCmd = new SqlCommand("MARAVILLA_SQL.spGetCuponesByIdCiudad", conn);

                dCmd.CommandType = CommandType.StoredProcedure;
                dCmd.Parameters.AddWithValue("@idCiudad", idCiudad);

                SqlParameter param = new SqlParameter("@fecha", fechaActual);
                param.SqlDbType = SqlDbType.Char;
                param.Size = 10;
                param.Direction = ParameterDirection.Input;

                dCmd.Parameters.Add(param);

                dr = dCmd.ExecuteReader();
                dCmd.Dispose();

                while (dr.Read())
                {
                    CuponEntity cupon = this.BuildCupon(dr);
                    cupones.Add(cupon);
                }

            }

            return cupones;
        }


        public bool AddCiudadToCupon(CiudadEntity _ciudad, CuponEntity _cupon)
        {
            
            using (SqlConnection conn = this.OpenConn())
            {

                SqlCommand dCmd = new SqlCommand("MARAVILLA_SQL.AddCiudadToCupon", conn);

                dCmd.CommandType = CommandType.StoredProcedure;
                dCmd.Parameters.AddWithValue("@intIdCiudad", _ciudad.IntIdCiudad);
                dCmd.Parameters.AddWithValue("@varCodigo_Groupon", _cupon.CodigoCupon);

                dCmd.ExecuteNonQuery();
                dCmd.Dispose();
            }

            return true;
        }

        public CuponEntity AddCupon(CuponEntity _cupon, UsuarioEntity _user)
        {

            CuponEntity cupon = new CuponEntity();
            using (SqlConnection conn = this.OpenConn())
            {
                SqlDataReader dr;

                SqlCommand dCmd = new SqlCommand("MARAVILLA_SQL.AddCupon", conn);

                dCmd.CommandType = CommandType.StoredProcedure;
                dCmd.Parameters.AddWithValue("@floatPrecio", _cupon.DetalleCupon.Precio);
                dCmd.Parameters.AddWithValue("@floatPrecio_Ficticio", _cupon.DetalleCupon.PrecioFicticio);
                dCmd.Parameters.AddWithValue("@varDescripcion", _cupon.DetalleCupon.Descripcion);
                dCmd.Parameters.AddWithValue("@intIdUsuario", _user.IntIdUsuario);
                dCmd.Parameters.AddWithValue("@datFechaVencOferta", _cupon.VencimientoFecha);
                dCmd.Parameters.AddWithValue("@datFechaVencConsumo", _cupon.VencConsumoFecha);
                dCmd.Parameters.AddWithValue("@datFechaPublic", _cupon.FechaPublic);
                dCmd.Parameters.AddWithValue("@intStock", _cupon.Stock);
                dCmd.Parameters.AddWithValue("@intCantMaxXCliente", _cupon.CantMaximaPorCliente);

                dr = dCmd.ExecuteReader();
                dCmd.Dispose();
                dr.Read();
                cupon.CodigoCupon = dr.GetValue(0).ToString();
            }

            return cupon;
        }

        public CuponEntity GetCuponByCodigo(CuponEntity _cupon)
        {
            CuponEntity cupon = new CuponEntity();

            using (SqlConnection conn = this.OpenConn())
            {

                SqlDataReader dr;

                SqlCommand dCmd = new SqlCommand("MARAVILLA_SQL.GetCuponByCodigo", conn);

                dCmd.CommandType = CommandType.StoredProcedure;
                dCmd.Parameters.AddWithValue("@varCodigo_Groupon", _cupon.CodigoCupon);

                dr = dCmd.ExecuteReader();
                dCmd.Dispose();

                dr.Read();
                cupon.CantMaximaPorCliente = Int32.Parse(dr["intCantMaxXCliente"].ToString());
                cupon.CodigoCupon = dr["varCodigo_Groupon"].ToString();
                cupon.DetalleCupon.Descripcion = dr["varDescripcion"].ToString();
                cupon.DetalleCupon.Precio = float.Parse(dr["floatPrecio"].ToString());
                cupon.DetalleCupon.PrecioFicticio = float.Parse(dr["floatPrecio_Ficticio"].ToString());
                cupon.FechaPublic = DateTime.Parse(dr["datFechaPublic"].ToString());
                cupon.VencimientoFecha = DateTime.Parse(dr["datFechaVencOferta"].ToString());
                cupon.VencConsumoFecha = DateTime.Parse(dr["datFechaVencConsumo"].ToString());
                cupon.Publicado = (dr["bitPublicado"].ToString() == "0") ? false : true;
                cupon.Stock = Int32.Parse(dr["intStock"].ToString());
                cupon.IdProveedor = Int32.Parse(dr["intIdProveedor"].ToString());
    
            }

            return cupon;
        }

        public CuponEntity GetCuponClienteByCodigo(string codigoCupon, int idCliente)
        {
            CuponEntity cupon = null;

            using (SqlConnection conn = this.OpenConn())
            {
                SqlDataReader dr;

                SqlCommand dCmd = new SqlCommand("MARAVILLA_SQL.spGetCuponClienteByCodigo", conn);

                dCmd.CommandType = CommandType.StoredProcedure;
                dCmd.Parameters.AddWithValue("@varCodigo_Groupon", codigoCupon);
                dCmd.Parameters.AddWithValue("@idCliente", idCliente);

                dr = dCmd.ExecuteReader();
                dCmd.Dispose();

                if (dr.Read())
                {
                    cupon = this.BuildCupon(dr);
                }
            }

            return cupon;
        }

        public List<CuponEntity> GetCuponesClienteByFechas(int idCliente, DateTime fechaNueva, DateTime fechaVieja)
        {
            List<CuponEntity> cupones = new List<CuponEntity>();
            int i;
            int idCompra = 0;

            using (SqlConnection conn = this.OpenConn())
            {

                SqlDataReader dr;

                SqlCommand dCmd = new SqlCommand("MARAVILLA_SQL.spGetCuponesClienteByFechas", conn);

                dCmd.CommandType = CommandType.StoredProcedure;
                dCmd.Parameters.AddWithValue("@idCliente", idCliente);
                dCmd.Parameters.AddWithValue("@fechaNueva", fechaNueva);
                dCmd.Parameters.AddWithValue("@fechaVieja", fechaVieja);

                dr = dCmd.ExecuteReader();
                dCmd.Dispose();

                while (dr.Read())
                {
                    CuponEntity cupon = this.BuildCupon(dr);

                    //Agrego la fecha y el id de compra
                    i = dr.GetOrdinal("datFecha_Compra");
                    if (!dr.IsDBNull(i))
                        cupon.FechaCompra = dr.GetDateTime(i);

                    i = dr.GetOrdinal("intIdCompra");
                    if (!dr.IsDBNull(i))
                        idCompra = dr.GetInt32(i);

                    if (idCompra!= 0)
                    {
                        cupon.Estado = this.ObtenerEstado(idCompra);
                    }
                    else
                    {
                        cupon.Estado = "Undefined";
                    }

                    cupones.Add(cupon);
                }

            }

            return cupones;
        }

        private string ObtenerEstado(int idCompra)
        {
            string estado = string.Empty;

            using (SqlConnection conn = this.OpenConn())
            {
                SqlDataReader dr;

                SqlCommand dCmd = new SqlCommand("MARAVILLA_SQL.spGetEstadoByIdCompra", conn);

                dCmd.CommandText = "MARAVILLA_SQL.spGetEstadoByIdCompra";
                dCmd.CommandType = CommandType.StoredProcedure;

                dCmd.Parameters.AddWithValue("@idCompra", idCompra);


                dr = dCmd.ExecuteReader();
                dCmd.Dispose();

                if (dr.Read())
                {
                    int i = dr.GetOrdinal("Estado");
                    if (!dr.IsDBNull(i))
                        estado = dr.GetString(i);
                }
            }

            return estado;
        }

        public List<CuponEntity> GetCuponesProveedorEntregados(int idProveedor)
        {
            List<CuponEntity> cupones = new List<CuponEntity>();

            using (SqlConnection conn = this.OpenConn())
            {

                SqlDataReader dr;

                SqlCommand dCmd = new SqlCommand("MARAVILLA_SQL.spGetCuponesProveedorEntregados", conn);

                dCmd.CommandType = CommandType.StoredProcedure;
                dCmd.Parameters.AddWithValue("@idProveedor", idProveedor);

                dr = dCmd.ExecuteReader();
                dCmd.Dispose();

                while (dr.Read())
                {
                    CuponEntity cupon = this.BuildCupon(dr);

                    int i = dr.GetOrdinal("intIdCompra");
                    if (!dr.IsDBNull(i))
                        cupon.IdCompra = dr.GetInt32(i);

                    i = dr.GetOrdinal("datFecha_Compra");
                    if (!dr.IsDBNull(i))
                        cupon.FechaCompra = dr.GetDateTime(i);

                    cupones.Add(cupon);
                }

            }

            return cupones;
        }

        private CuponEntity BuildCupon(SqlDataReader dr)
        {
            int i;
            CuponEntity cupon = new CuponEntity();

            i = dr.GetOrdinal("varcodigo_groupon");
            if (!dr.IsDBNull(i))
                cupon.CodigoCupon = dr.GetString(i);

            i = dr.GetOrdinal("intidproveedor");
            if (!dr.IsDBNull(i))
                cupon.IdProveedor = dr.GetInt32(i);

            i = dr.GetOrdinal("datfechapublic");
            if (!dr.IsDBNull(i))
                cupon.FechaPublic = dr.GetDateTime(i);

            i = dr.GetOrdinal("datfechavencconsumo");
            if (!dr.IsDBNull(i))
                cupon.VencConsumoFecha = dr.GetDateTime(i);

            i = dr.GetOrdinal("datfechavencoferta");
            if (!dr.IsDBNull(i))
                cupon.VencimientoFecha = dr.GetDateTime(i);

            i = dr.GetOrdinal("intstock");
            if (!dr.IsDBNull(i))
                cupon.Stock = Convert.ToInt32(dr[i]);

            i = dr.GetOrdinal("intcantmaxxcliente");
            if (!dr.IsDBNull(i))
                cupon.CantMaximaPorCliente = Convert.ToInt32(dr[i]);

            i = dr.GetOrdinal("varRS");
            if (!dr.IsDBNull(i))
                cupon.ProveeRS = dr.GetString(i);

            i = dr.GetOrdinal("varnombre");
            if (!dr.IsDBNull(i))
                cupon.Rubro = dr.GetString(i);

            cupon.DetalleCupon = this.BuildDetalleCupon(dr);

            return cupon;
        }

        private DetalleCuponEntity BuildDetalleCupon(SqlDataReader dr)
        {
            int i;
            DetalleCuponEntity detalleCupon = new DetalleCuponEntity();

            i = dr.GetOrdinal("intidgroupondetalle");
            if (!dr.IsDBNull(i))
                detalleCupon.Id = dr.GetInt32(i);

            i = dr.GetOrdinal("vardescripcion");
            if (!dr.IsDBNull(i))
                detalleCupon.Descripcion = dr.GetString(i);

            i = dr.GetOrdinal("floatprecio");
            if (!dr.IsDBNull(i))
                detalleCupon.Precio = (float)dr.GetDecimal(i);

            i = dr.GetOrdinal("floatprecio_ficticio");
            if (!dr.IsDBNull(i))
                detalleCupon.Precio = (float)dr.GetDecimal(i);

            return detalleCupon;
        }
    }
}
